package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Repository是Spring家族框架对持久层的命名
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    // ItemRepository接口要继承SpringData提供的ElasticsearchRepository父接口
    // 一旦继承,当前接口就可以编写连接ES进行操作的代码了,继承了这个父接口之后
    // 会自动生成对Item数据的基本增删改查方法,无需我们自己编写
    // ElasticsearchRepository<[关联的实体类的名称],[实体类主键的类型]>


    // SpringData实现自定义查询
    // 我们要编写遵循SpringData给定格式的方法名
    // SpringData会根据我们编写的方法名自动完成数据操作
    // query(查询):表示当前方法是一个查询方法,类似sql语句中的select
    // Item/Items:确定要查询哪一个实体类,不带s的是单个对象,带s是集合
    // By(通过/根据):标识开始设置查询条件,类似sql语句中的where
    // Title:要查询的字段,可以根据查询条件修改为Item中的任何字段
    // Matches:执行查询的操作,Matches表示字符串的匹配,而且这个匹配是支持分词的,类似sql语句的like

    Iterable<Item> queryItemsByTitleMatches(String title);


    // 多条件查询
    // 多个条件之间要使用逻辑运算符and或or来分隔,表示多个条件间的逻辑关系
    // 我们如果要查询title包含某个关键字的同时指定品牌的查询
    // 多个参数时,SpringData会按照参数声明的顺序向需要参数的位置赋值,和参数名无关
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(
                                            String title,String brand);


    // 排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
                                            String title,String brand);

    // 分页查询
    // 返回值类型修改为Page类型,这个类型中包含了查询到的当前页数据和本次查询的相关分页信息
    // 分页信息指:当前页码,总页数,总条数,每页条数,是否有上一页,是否有下一页等
    // 方法参数要添加Pageable,在所有的参数后再添加一个新的参数类型 Pageable
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);


}
